package xx.services.page.rest;

import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.sql.RowSet;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;

import xx.entity.page.Page;
import xx.entity.page.PageLayout;
import xx.entity.page.PageLayoutLink;
import xx.entity.task.PageJob;
import xx.services.Passport;
import xx.services.page.inter.IPageInterface;
import xx.services.util.Constants;
import xx.util.Arr;
import xx.util.string.Format;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 * 页面管理服务接口
 * 
 * @Path (Constants.RESTFUL_ROOT_PATH + "/page")
 * @author chenxiang 2010-12-20
 */
@Path(Constants.RESTFUL_ROOT_PATH + "/page")
public class PageRest extends Passport implements IPageInterface
{

    public PageRest(@Context
    HttpServletRequest request)
    {
        super(request);
        // TODO Auto-generated constructor stub
    }

    /**
     * 增加一个新页面
     * 
     * @POST
     * @param pagekey-@FormParam("pagekey")
     *            页面唯一key
     * @param title-@FormParam("title")
     *            页面标题
     * @param keywords-@FormParam("keywords")
     *            页面Meta keywords属性
     * @param description-@FormParam("description")
     *            页面Meta 描述属性
     * @param templet-@FormParam("templet")
     *            页面模板代码
     * @param demo-@FormParam("demo")
     *            页面示例代码
     * @return 新页面实体
     * @author chenxiang 2010-12-20
     */
    @POST
    public String add(@FormParam("pagekey")
    String pagekey, @FormParam("title")
    String title, @FormParam("keywords")
    String keywords, @FormParam("description")
    String description, @FormParam("templet")
    String templet, @FormParam("demo")
    String demo)
    {
        try
        {
            if (Format.isEmpty(pagekey))
                pagekey = "" + System.currentTimeMillis();

            Page page = new Page(qr, owner);
            page.setPagekey(pagekey).setTitle(title).setKeywords(keywords).setDescription(
                    description).setTemplet(templet).setDemo(demo);
            page.insert();
            return ok(page);
        }
        catch (SQLException e)
        {
            return error(e);
        }
    }

    /**
     * 新增布局Layout，包含布局Item模板数据
     * 
     * @POST
     * @Path ("/{page_id}/layout")
     * @param pageId-@PathParam("page_id")
     *            页面ID
     * @param layout-@FormParam("layout")
     *            布局demo的Json字符串
     * @return 增加成功的布局实体集
     * @author chenxiang 2010-12-20
     */
    @POST
    @Path("/{page_id}/layout")
    public String addLayout(@PathParam("page_id")
    long pageId, @DefaultValue("")
    @FormParam("layout")
    String layout)
    {
        try
        {
            PageLayoutLink pll = new PageLayoutLink(qr, owner);
            pll.setPageId(pageId);
            PageLayout pl = new PageLayout(qr, owner);
            // 先判断layout是否是layoutID组合，组合格式为：{layout_id1}_{layout_id2}_....
            Pattern pattern = Pattern.compile("\\d+|\\d+(_\\d+)+$");
            Matcher matcher = pattern.matcher(layout);
            if (matcher.matches())
            {
                long[] layoutIds = Format.strTolongArray(layout, "_");
                if (layoutIds != null && layoutIds.length > 0)
                {
                    for (long layoutId : layoutIds)
                    {
                        pl.setLayoutId(layoutId).load();
                        pll.setLayoutId(pl.getLayoutId()).setSequence(pll.getMaxSeq() + 1).insert();
                    }
                }
            }
            else
            {
                JsonParser parser = new JsonParser();
                JsonObject jo = parser.parse(Format.formatJSON(layout)).getAsJsonObject();
                pl.update(jo);
                pll.setLayoutId(pl.getLayoutId()).setSequence(pll.getMaxSeq() + 1).insert();
            }

            return ok(true);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    @GET
    @Path("/{page_id}/html")
    public String createHtml(@PathParam("page_id")
    long pageId)
    {
        try
        {
            Page page = new Page(qr, owner);
            String html = page.setPageId(pageId).toHtml();
            return ok(html, HTML);
        }
        catch (SQLException e)
        {
            return error(e);
        }
    }

    /**
     * 新页面生成为HTML文件，文件名为{pagekey}.html
     * 
     * @GET
     * @Path ("/{page_id}/html")
     * @param pageId-@PathParam("page_id")
     *            页面ID，多个ID用下划线“_”隔开
     * @return true-成功，string-其他表示失败（string就是失败原因）
     * @author chenxiang 2010-12-21
     */
    @POST
    @Path("/{page_id}/html")
    public String createHtml(@PathParam("page_id")
    String pageId)
    {
        try
        {
            long[] pageIds = Format.strTolongArray(pageId, "_");
            for (long pId : pageIds)
            {
                Page page = new Page(qr, owner);
                page.setPageId(pId).load();
                // String html = page.setPageId(pId).toHtml();
                // return ok(html, HTML);
                PageJob pj = new PageJob();
                pj.create(page);
            }
            return ok(true);
        }
        catch (SQLException e)
        {
            return error(e);
        }
    }

    /**
     * 删除页面
     * 
     * @DELETE
     * @Path ("/{page_id}")
     * @param pageId-@PathParam("page_id")
     *            页面ID，多个ID用“_”隔开
     * @return true-删除成功，string-其他删除失败（string就是失败原因）
     * @author chenxiang 2010-12-20
     */
    @DELETE
    @Path("/{page_id}")
    public String delete(@PathParam("page_id")
    String pageId)
    {
        try
        {
            int count = 0;
            long[] pageIdArr = Arr.toLongArray(pageId, "_");
            for (long id : pageIdArr)
            {
                Page page = new Page(qr, owner);
                page.setPageId(id).delete();
                count++;
            }
            return ok(count);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    /**
     * 获取一个页面
     * 
     * @GET
     * @Path ("/{page_id: \\d+}")
     * @param pageId-@PathParam("page_id")
     *            页面ID
     * @return 页面实体
     * @author chenxiang 2010-12-20
     */
    @GET
    // @Path("/{page_id: \\d+}")
    @Path("/{page_id}")
    public String get(@PathParam("page_id")
    String pageId)
    {
        try
        {
            Page page = new Page(qr, owner);
            // 先判断pageId是数字还是字符串，如果是数据，表明是pageId；如果是字符串，表明是pagekey
            // Pattern pattern = Pattern.compile("\\d+");
            // Matcher matcher = pattern.matcher(pageId);
            if (pageId.matches("\\d+|\\d+(_\\d+)+$"))
            {
                page.setPageId(Integer.parseInt(pageId)).load();
            }
            else
            {
                page.setPagekey(pageId).load();
            }
            return ok(page);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    // /**
    // * 获取一个页面
    // *
    // * @GET
    // * @Path ("/{pagekey: [a-zA-Z0-9].*}")
    // * @param pagekey-@PathParam("pagekey")
    // * 页面ID
    // * @return 页面实体
    // * @author chenxiang 2010-12-20
    // */
    // @GET
    // @Path("/{pagekey: [a-zA-Z0-9].*}")
    // public String get(@PathParam("pagekey")
    // String pagekey)
    // {
    // try
    // {
    // Page page = new Page(qr, owner);
    // page.setPagekey(pagekey).load();
    // return ok(page);
    // }
    // catch (Exception e)
    // {
    // return error(e);
    // }
    // }

    /**
     * 获取当前页面下的所有一级布局
     * 
     * @GET
     * @Path ("/{page_id}/layout")
     * @param pageId-@PathParam("page_id")
     *            页面ID
     * @return 布局实体RowSet列表
     * @author chenxiang 2010-12-21
     */
    @GET
    @Path("/{page_id}/layout")
    public String getLayouts(@PathParam("page_id")
    long pageId)
    {
        try
        {
            Page page = new Page(qr, owner);
            RowSet rs = page.setPageId(pageId).getLayoutsOfRowset();
            return ok(rs);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    /**
     * 获取页面列表
     * 
     * @GET
     * @return 页面实体RowSet列表
     * @author chenxiang 2010-12-20
     */
    @GET
    public String gets()
    {
        try
        {
            Page page = new Page(qr, owner);
            RowSet rs = page.getList(pageSize, pageNo, condition, orderField, fields);
            return ok(rs);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    /**
     * 把页面{page_id}设置为首页<br>
     * 注：把当前页面设置为首页时，要把其他页面的首页状态标志（is_index）恢复为false状态
     * 
     * @PUT
     * @Path ("/{page_id}/index")
     * @param pageId-@PathParam("page_id")
     *            页面ID
     * @author chenxiang 2010-12-20
     * @return true-设置成功，string-其他设置失败（string就是失败原因）
     */
    @PUT
    @Path("/{page_id}/index")
    public String setIndex(@PathParam("page_id")
    long pageId)
    {
        try
        {
            Page page = new Page(qr, owner);
            page.setPageId(pageId).setHomePage();
            return ok(true);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    /**
     * 修改页面
     * 
     * @PUT
     * @Path ("/{page_id}")
     * @param pageId-@PathParam("page_id")
     *            页面ID
     * @param pagekey-@FormParam("pagekey")
     *            页面唯一key
     * @param title-@FormParam("title")
     *            页面标题
     * @param keywords-@FormParam("keywords")
     *            页面Meta keywords属性
     * @param description-@FormParam("description")
     *            页面Meta 描述属性
     * @param templet-@FormParam("templet")
     *            页面模板代码
     * @param demo-@FormParam("demo")
     *            页面示例代码
     * @param layout-@FormParam("layout")
     *            布局demo的Json字符串
     * @return 新页面实体
     * @author chenxiang 2010-12-20
     */
    @PUT
    @Path("/{page_id}")
    public String update(@PathParam("page_id")
    long pageId, @FormParam("pagekey")
    String pagekey, @FormParam("title")
    String title, @FormParam("keywords")
    String keywords, @FormParam("description")
    String description, @FormParam("templet")
    String templet, @FormParam("demo")
    String demo)
    {
        try
        {
            Page page = new Page(qr, owner);
            page.setPageId(pageId);
            StringBuilder updateColumn = new StringBuilder();

            if (!Format.isEmpty(pagekey))
            {
                page.setPagekey(pagekey);
                updateColumn.append(",").append(Page.PAGEKEY);
            }

            if (!Format.isEmpty(title))
            {
                page.setTitle(title);
                updateColumn.append(",").append(Page.TITLE);
            }

            if (!Format.isEmpty(keywords))
            {
                page.setKeywords(keywords);
                updateColumn.append(",").append(Page.KEYWORDS);
            }

            if (!Format.isEmpty(description))
            {
                page.setDescription(description);
                updateColumn.append(",").append(Page.DESCRIPTION);
            }

            if (!Format.isEmpty(templet))
            {
                page.setTemplet(templet);
                updateColumn.append(",").append(Page.TEMPLET);
            }

            if (!Format.isEmpty(demo))
            {
                page.setDemo(demo);
                updateColumn.append(",").append(Page.DEMO);
            }

            if (updateColumn.length() > 0)
            {
                page.update(updateColumn.toString());
            }
            return ok(page);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    /**
     * 更新页面下第一级页面布局的排列顺序<br>
     * 注：需要清理无用的layout，也就是layoutId与p_layout_link表中page_id下对应不上的layout_id
     * 
     * @PUT
     * @Path ("/{page_id}/layout/{layout_id}")
     * @param pageId-@PathParam("page_id")
     *            页面ID
     * @param layoutId-@FormParam("layout_id")
     *            当前页面中的所有第一级布局的ID，ID用“_”隔开，排列顺序就按ID的先后顺序排序
     * @return true-成功，string-其他表示失败（string就是失败原因）
     * @author chenxiang 2010-12-20
     */
    @PUT
    @Path("/{page_id}/layout/{layout_id}")
    public String updateLayoutSequence(@PathParam("page_id")
    long pageId, @FormParam("layout_id")
    String layoutId)
    {
        try
        {
            Page page = new Page(qr, owner);
            boolean flag = page.setPageId(pageId).sortLayout(layoutId);
            return ok(flag);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    @PUT
    @Path("/{page_id}/layout/{layout_id}/after/{after_id}")
    public String layoutAfter(@PathParam("page_id")
    long pageId, @PathParam("layout_id")
    long layoutId, @PathParam("after_id")
    long afterId)
    {
        try
        {
            PageLayoutLink pll = new PageLayoutLink(qr, owner);
            pll.setPageId(pageId).setLayoutId(layoutId).after(afterId);
            return ok(true);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    @PUT
    @Path("/{page_id}/layout/{layout_id}/before/{before_id}")
    public String layoutBefore(@PathParam("page_id")
    long pageId, @PathParam("layout_id")
    long layoutId, @PathParam("before_id")
    long beforeId)
    {
        try
        {
            PageLayoutLink pll = new PageLayoutLink(qr, owner);
            pll.setPageId(pageId).setLayoutId(layoutId).before(beforeId);
            return ok(true);
        }
        catch (Exception e)
        {
            return error(e);
        }
    }

    @DELETE
    @Path("/{page_id}/layout/{layout_id}")
    public String deleteLayout(@PathParam("page_id")
    String pageId, @PathParam("layout_id")
    String layoutId)
    {
        try
        {
            if (Format.isEmpty(layoutId))
                return null;

            long pId = 0;

            if (pageId.matches("\\d+$"))
            {
                pId = Long.parseLong(pageId);
            }
            else
            {
                Page page = new Page(qr, owner);
                page.setPagekey(pageId).load();
                pId = page.getPageId();
            }

            PageLayoutLink pll = new PageLayoutLink(qr, owner);

            long[] layoutIdArr = Arr.toLongArray(layoutId, "_");
            int count = pll.setPageId(pId).delete(layoutIdArr);

            return ok(count);
        }
        catch (SQLException e)
        {
            return error(e);
        }
    }

}
